﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;


using Gman.Entity.Entities;
using Gman.WebApp.ServiceControllers;
using Gman.WebApp.Models;
using System.Web.Caching;
using System.Web.UI;
using Gman.WebApp.Controllers.Base;
using Gman.WebApp.Models.Validator;

namespace Gman.WebApp.Controllers
{
    public class BajaActivoController : BaseController
    {
        private OperacionServiceController service = new OperacionServiceController();
        private IList<BajaActivoBE> lista = new List<BajaActivoBE>();

        protected static IList<BajaActivoDetalleBE> bajaActivoDelete = new List<BajaActivoDetalleBE>(); //lista de eliminados

        //
        // GET: /BajaActivo/Search

        public ActionResult Search()
        {
            var cache = new CacheProvider();
            BajaActivoBE bajaActivo = new BajaActivoBE();

            var model = new BajaActivoModel(bajaActivo);
            cache.Set(model.ID.Value.ToString(), model);

            model.Action = "search";
            model.ToolBar = new ToolBarModel();

            return View(@"~/Views/BajaActivo/Edit.aspx", model);
        }

        // POST: /BajaActivo/DoSearch   
        public ActionResult DoSearch(string cod)
        {
            var cache = new CacheProvider();

            BajaActivoBE obj = new BajaActivoBE();
            obj.NroGuiaSalida = cod;

            var bajaActivo = service.ObtenerBajaActivo(obj);
            if (bajaActivo != null)
            {
                var model = new BajaActivoModel(bajaActivo);
                cache.Set(model.ID.Value.ToString(), model);
                model.Action = "query";
                model.ToolBar = new ToolBarModel();

                Int64 IDBajaActivo = Convert.ToInt64(model.BajaActivo.IDBajaActivo);
                TempData["IDBajaActivo"] = IDBajaActivo;

                model.BajaActivoDetalles = new List<BajaActivoDetalleModel>();

                IList<BajaActivoDetalleBE> listaBajaActivoDetalles = new List<BajaActivoDetalleBE>();
                BajaActivoDetalleBE baja = new BajaActivoDetalleBE();
                baja.IDBajaActivo = Convert.ToInt64(TempData["IDBajaActivo"]);
                listaBajaActivoDetalles = service.ListarBajaActivoDetalle(baja);

                foreach (BajaActivoDetalleBE bajasActivos in listaBajaActivoDetalles)
                {
                    //model.BajaActivoDetalles.Add(new BajaActivoDetalleModel(bajasActivos));

                    IList<BienBE> listaBienes = new List<BienBE>();
                    BienBE bien = new BienBE();
                    bien.IDEmp = 1;
                    listaBienes = service.ListarBien(bien);

                    foreach (BienBE bienes in listaBienes)
                    {
                        if (bienes.IDBien == bajasActivos.IDBien)
                        {
                            model.BajaActivoDetalles.Add(new BajaActivoDetalleModel(bienes, bajasActivos));
                        }
                    }


                }

                return View(@"~/Views/BajaActivo/Edit.aspx", model);
            }

            return AjaxResultSuccess(string.Format("No se encontró baja de activo :{0} ", cod));
        }

        // GET: /BajaActivo/Create
        public ActionResult Create()
        {
            var cache = new CacheProvider();
            BajaActivoBE bajaActivo = new BajaActivoBE();

            var model = new BajaActivoModel(bajaActivo);
            cache.Set(model.ID.Value.ToString(), model);
            model.Action = "create";
            model.ToolBar = new ToolBarModel();

            return View(@"~/Views/BajaActivo/Edit.aspx", model);
        }

        // POST: /BajaActivo/Edit
        public ActionResult Edit(string cod)
        {
            var cache = new CacheProvider();

            BajaActivoBE obj = new BajaActivoBE();
            obj.NroGuiaSalida = cod;

            var bajaActivo = service.ObtenerBajaActivo(obj);
            if (bajaActivo != null)
            {
                var model = new BajaActivoModel(bajaActivo);
                cache.Set(model.ID.Value.ToString(), model);
                model.Action = "edit";
                model.ToolBar = new ToolBarModel();

                Int64 IDBajaActivo = Convert.ToInt64(model.BajaActivo.IDBajaActivo);
                TempData["IDBajaActivo"] = IDBajaActivo;

                model.BajaActivoDetalles = new List<BajaActivoDetalleModel>();

                IList<BajaActivoDetalleBE> listaBajaActivoDetalles = new List<BajaActivoDetalleBE>();
                BajaActivoDetalleBE baja = new BajaActivoDetalleBE();
                baja.IDBajaActivo = Convert.ToInt64(TempData["IDBajaActivo"]);
                listaBajaActivoDetalles = service.ListarBajaActivoDetalle(baja);

                foreach (BajaActivoDetalleBE bajasActivos in listaBajaActivoDetalles)
                {
                    //model.BajaActivoDetalles.Add(new BajaActivoDetalleModel(bajasActivos));

                    IList<BienBE> listaBienes = new List<BienBE>();
                    BienBE bien = new BienBE();
                    bien.IDEmp = 1;
                    listaBienes = service.ListarBien(bien);

                    foreach (BienBE bienes in listaBienes)
                    {
                        if (bienes.IDBien == bajasActivos.IDBien)
                        {
                            model.BajaActivoDetalles.Add(new BajaActivoDetalleModel(bienes, bajasActivos));
                        }
                    }


                }
                
                return View(@"~/Views/BajaActivo/Edit.aspx", model);
            }

            return AjaxResultSuccess(string.Format("No se encontró baja de activo :{0} ", cod));
        }

        public JsonResult Save(Guid id, string action)
        {
            try
            {
                UsuariosBE user = (UsuariosBE)Session["user"];
                BajaActivoModel model = GetBajaActivoModel(id);

                BajaActivoBE bajaActivo = new BajaActivoBE();


                List<BajaActivoDetalleBE> ListBajas = new List<BajaActivoDetalleBE>();
                foreach (var bajas in model.BajaActivoDetalles)
                {
                    bajas.BajaActivoDetalle.IDBien = bajas.Bien.IDBien;
                    ListBajas.Add(bajas.BajaActivoDetalle);
                }

                List<BajaActivoDetalleBE> Listeliminados = new List<BajaActivoDetalleBE>();
                foreach (var eliminados in model.toDelete)
                {
                    Listeliminados.Add(eliminados.BajaActivoDetalle);
                }


                if (model.Action == "create")
                {
                    BajaActivoBE obj = new BajaActivoBE();
                    obj = model.BajaActivo;
                    obj.NroGuiaSalida = "GS-" + (service.ListarBajaActivo(bajaActivo).Count + 1);
                    obj.UsuReg = user.NomUsu;
                    obj.TermCnxReg = Environment.MachineName;
                    obj.FecRegis = DateTime.Now;
                    obj.IDEmp = user.IDEmp;

                    int codBaja = service.RegistrarBajaActivo(obj, ListBajas);

                    if (codBaja >= 1)
                    {
                        TempData["IDBajaActivo"] = codBaja;
                        return AjaxResultSuccess(string.Format("Baja de Activo {0} se guardo exitosamente.", obj.NroGuiaSalida));
                    }
                    else
                    {
                        return AjaxResultSuccess(string.Format("No se guardo exitosamente."));
                    }
                }

                if (model.Action == "edit")
                {
                    BajaActivoBE obj = new BajaActivoBE();
                    obj = model.BajaActivo;
                    obj.FecMod = DateTime.Now;
                    obj.TermCnxMod = Environment.MachineName;
                    obj.UsuMod = user.NomUsu;

                    int codBaja = service.ActualizarTransferenciaActivo(obj, ListBajas, Listeliminados);

                    if (codBaja >= 1)
                    {
                        TempData["IDBajaActivo"] = codBaja;
                        return AjaxResultSuccess(string.Format("Baja {0} se actualizo exitosamente.", obj.NroGuiaSalida));

                    }
                    else
                    {
                        return AjaxResultSuccess(string.Format("No se guardo exitosamente."));
                    }

                }

                return AjaxResultSuccessNoParam();
            }
            catch (Exception ex)
            {
                return AjaxResultError(ex.Message);
            }
        }

        public ActionResult UpdateField(string fieldName, string fieldValue, Guid id, string setterFormatOptions)
        {
            BajaActivoModel model = GetBajaActivoModel(id);
            SetterFormatOptions setterFormatOptionsEnum = SetterFormatOptionsHelper.Parse(setterFormatOptions);
            List<KeyValuePair<string, string>> validationList = new List<KeyValuePair<string, string>>();

            var setter = new PropertySetter<BajaActivoBE>.SetterOptions();
            setter.objectToSet = model.BajaActivo;
            setter.property = fieldName;
            setter.val = fieldValue;
            setter.SetterFormatOptions = setterFormatOptionsEnum;
            setter.validationList = validationList;

            object valueWasSet = PropertySetter<BajaActivoBE>.SetFinalObject(setter);


            validationList.AddRange(new BajaActivoModelValidator().Validate(model));

            return Json
                (new
                {
                    result = true,
                    PropertyValidationList = validationList,
                }
                );
        }

        public ActionResult GetValidation(Guid id)
        {
            BajaActivoModel model = GetBajaActivoModel(id);
            List<KeyValuePair<string, string>> validationList = new List<KeyValuePair<string, string>>();
            List<KeyValuePair<string, string>> propertyChangeList = new List<KeyValuePair<string, string>>();

            validationList.AddRange(new BajaActivoModelValidator().Validate(model));

            return Json(new
            {
                PropertyValidationList = validationList,
                PropertyVisibilityList = propertyChangeList
            });
        }

        public ViewResult LoadAddOrEditActivos(Guid id, Guid? activoGuid)
        {
            var cache = new CacheProvider();
            BajaActivoDetalleModel activo = null;
            if (!activoGuid.HasValue)
            {
                activo = new BajaActivoDetalleModel(new BajaActivoDetalleBE());
                activo.Action = "create";
                cache.Set(activo.ID.Value.ToString(), activo);
            }
            else
            {
                var activoModel = GetBajaActivoModel(id);
                activo = activoModel.BajaActivoDetalles.FirstOrDefault(x => x.ID == activoGuid.Value);
                activo.Action = "edit";
                if (activo.BajaActivoDetalle.IDBajaActivo.HasValue)
                {
                    cache.Set(activoGuid.ToString(), activo);
                }
            }
            return View(@"~/Views/BajaActivoDetalle/AddOrEditDetalle.ascx", activo);
        }

        public BajaActivoModel GetBajaActivoModel(Guid id)
        {
            var cache = new CacheProvider();

            string key = id.ToString();
            var existingModel = cache.Get(key);
            if (existingModel == null)
            {
                existingModel = new BajaActivoModel(new BajaActivoBE());
                cache.Set(key, existingModel);
            }
            return (BajaActivoModel)existingModel;
        }

        public JsonResult AddOrEditActivo(Guid id, Guid activoGuid, string action)
        {
            try
            {
                var activo = new BajaActivoDetalleController().GetBajaActivoDetalleModel(activoGuid);
                var model = GetBajaActivoModel(id);
                bool estado = true;
                if (action == "create")
                {
                    if (model.BajaActivoDetalles.Count >= 1)
                    {


                        foreach (var existe in model.BajaActivoDetalles)
                        {
                            if (activo.Bien.IDBien == existe.Bien.IDBien)
                            {
                                estado = false;
                            
                            }

                        }

                        if (estado)
                        {
                            activo.BajaActivoDetalle.IDBajaActivo= 0;
                            model.BajaActivoDetalles.Add(activo);
                        }



                    }
                    else
                    {
                        activo.BajaActivoDetalle.IDBajaActivo = 0;
                        model.BajaActivoDetalles.Add(activo);
                    }

                }
                else if (action == "edit")
                {
                    var activoToEdit = model.BajaActivoDetalles.FirstOrDefault(x => x.ID == activoGuid);
                    activoToEdit = activo;
                }

                return AjaxResultSuccessNoParam();
            }
            catch (Exception ex)
            {
                return AjaxResultError(ex.Message);
            }
        }

        public ViewResult DeleteActivo(Guid id, Guid activoGuid)
        {
            var model = GetBajaActivoModel(id);
            var activo = model.BajaActivoDetalles.FirstOrDefault(x => x.ID == activoGuid);
            model.BajaActivoDetalles.Remove(activo);

            if (model.Action == "edit" && activo.BajaActivoDetalle.IDBajaActivo> 0)
            {
                model.toDelete.Add(activo);
            }

            return View(@"~/Views/BajaActivo/ListaBajaActivoDetalle.ascx", model);
        }

        public ViewResult GetListaActivo(Guid id)
        {
            BajaActivoModel model = GetBajaActivoModel(id);
            return View(@"~/Views/BajaActivo/ListaBajaActivoDetalle.ascx", model);
        }
    }
}
